/**
 * 
 */
package interceptor;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import annuaire.rmi.remotedObject.IRemotedAnnuaire;

/**
 * Classe Interceptor utile pour la gestion des droits
 * 
 * @author Yannick Lorenzati & Stephanie Malakian
 * 
 */
public class CheckAccesInterceptor extends HandlerInterceptorAdapter {

	/** Logger pour cette classe ainsi que pour ses sous classes */
	protected final Log logger = LogFactory.getLog(getClass());

	/**
	 * List des pages authorisées pour un administrateur
	 */
	private List<String> adminPage;

	/**
	 * List des pages authorisées pour un étudiant
	 */
	private List<String> studentPage;

	/**
	 * List des pages authorisées pour un utilisateur anonyme
	 */
	private List<String> anonymousPage;

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.springframework.web.servlet.handler.HandlerInterceptorAdapter#preHandle
	 * (javax.servlet.http.HttpServletRequest,
	 * javax.servlet.http.HttpServletResponse, java.lang.Object)
	 */
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {

		String role = (String) request.getSession().getAttribute("role");
		String target = request.getServletPath();

		if (role.equals(IRemotedAnnuaire.roleAdmin)) {

			// si l'admin n'a pas acces a cette page
			if (!adminPage.contains(target)) {

				logger.info("Acces interdit : Un " + IRemotedAnnuaire.roleAdmin
						+ " a tenté d'acceder a " + target);
				response.sendRedirect(request.getContextPath() + "/home.htm");
				return false;
			}

		} else if (role.equals(IRemotedAnnuaire.roleStudent)) {

			// si l'etudiant n'a pas acces a cette page
			if (!studentPage.contains(target)) {

				logger.info("Acces interdit : Un "
						+ IRemotedAnnuaire.roleStudent
						+ " a tenté d'acceder a " + target);
				response.sendRedirect(request.getContextPath() + "/home.htm");
				return false;
			}

		} else {

			// si l'utilisateur anonyme n'a pas acces a cette page
			if (!anonymousPage.contains(target)) {

				logger.info("Acces interdit : Un "
						+ IRemotedAnnuaire.roleAnonymous
						+ " a tenté d'acceder a " + target);
				response.sendRedirect(request.getContextPath() + "/home.htm");
				return false;
			}

		}

		return super.preHandle(request, response, handler);
	}

	/**
	 * @param adminPage
	 */
	public void setAdminPage(List<String> adminPage) {
		this.adminPage = adminPage;
	}

	/**
	 * @return
	 */
	public List<String> getAdminPage() {
		return adminPage;
	}

	/**
	 * @param studentPage
	 */
	public void setStudentPage(List<String> studentPage) {
		this.studentPage = studentPage;
	}

	/**
	 * @return
	 */
	public List<String> getStudentPage() {
		return studentPage;
	}

	/**
	 * @param anonymousPage
	 */
	public void setAnonymousPage(List<String> anonymousPage) {
		this.anonymousPage = anonymousPage;
	}

	/**
	 * @return
	 */
	public List<String> getAnonymousPage() {
		return anonymousPage;
	}

}
